package main

// 泛型函数

import "fmt"

type ordered interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 |
		~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
		~float32 | ~float64 |
		~string
}

func maxGeneric[T ordered](sl []T) T {
	if len(sl) <= 0 {
		panic("slice is empty")
	}

	max := sl[0]
	for i := 1; i < len(sl); i++ {
		if sl[i] > max {
			max = sl[i]
		}
	}
	return max
}

type myString string

func main() {
	// maxGeneric[int]() 调用时可指定类型参数 T 的类型
	m := maxGeneric[int]([]int{1, 3, 5, 7, 9, 2, 4, 6, 8, 10})
	fmt.Println(m)

	// 当编译器可以推断出类型参数 T 时，可以省略
	n := maxGeneric([]int{1, 3, 5, 7, 9, 2, 4, 6, 8, 10})
	fmt.Println(n)

	fmt.Println(maxGeneric([]myString{"11", "13", "88", "10", "23"}))

	fmt.Println(maxGeneric([]float64{1.01, 2.02, 3.03, 5.05, 7.07, 0.01})) // 输出：7.07
}
